// 知识点1：protected成员，类的对象用户不可访问，派生类和友元可访问

// 知识点2：派生类的成员只能通过派生类对象来访问基类的受保护成员!!!也就是说派生类不能访问基类对象的受保护成员

// class A
// {
// protected:
// 	int i;
// };

// class B:public A
// {
// public:
// 	friend void foo(B &);
// 	friend void foo(A &);
// 	int j;
// };

// void foo(B &b){b.i = 0;};
// void foo(A &a){a.i =
// 0;};//派生类的成员或者友元不能通过其基类的对象来访问受保护成员
// 知识点3：派生类的成员和友元只能访问派生类对象中的基类的受保护部分，对于普通的基类对象的受保护成员不具有特殊的访问权限

// 知识点4：共有继承，继承自基类的成员在派生类中遵循原有的访问说明符，私有继承，继承而来的基类成员在派生类中变为private，变为私有，派生类的对象都不可以访问其本身的私有成员，但私有继承不影响派生类本身的访问权限，它同样不可以使用基类的私有成员。

// 知识点5：友元关系不能继承，每个类负责自己控制自己成员的访问权限

// 知识点6：当一个类将另一个类作为友元函数时，这种友元关系只对作出声明的类有效，对于原来的类来说，其友元的基类或派生类不具备特殊访问能力

// 知识点7：通过在类的内部使用using声明改变派生类继承的某个名字的访问权限，using语句中名字的访问权限由该using出现之前的访问说明符决定

// 知识点8：struct默认公有继承，private默认私有继承，但是我们最好将其显式的表明

// 知识点9：1：
// 假定B继承自A，无论B以什么方式继承A，B的成员函数和友元都能使用派生类到基类的转换

// 2：
// B继承A的方式是公有或者保护，则B的派生类的成员或友元可以使用B到A的转换，若未私有则不行

// 3：
// B继承A的方式是公有的，用户的代码才能使用B到A的（派生类到基类）的转换，保护或者私有方式则不行

// 答案：见知识点9